#pragma once

#include <Arduino.h>
#include "Screen.h"
#include "Keys.h"
#include "pins_config.h"

// 打砖块游戏类
class Brick {
public:
  // 游戏入口
  void main(Screen &screen, Keys &keys);

private:
  // 游戏常量
  static const int PADDLE_WIDTH = 40;  // 挡板宽度
  static const int PADDLE_HEIGHT = 6;  // 挡板高度
  static const int PADDLE_Y = 500;     // 挡板Y位置
  static const int PADDLE_SPEED = 8;   // 挡板移动速度

  static const int BALL_SIZE = 6;   // 球的大小
  static const int BALL_SPEED = 3;  // 球的初始速度

  static const int BRICK_COLS = 10;                // 砖块列数
  static const int BRICK_ROWS = 6;                 // 砖块行数
  static const int BRICK_WIDTH = 20;               // 砖块宽度
  static const int BRICK_HEIGHT = 10;              // 砖块高度
  static const int BRICK_PADDING = 2;              // 砖块间距
  static const int BRICK_OFFSET_X = 10;            // 砖块区域X偏移
  static const int BRICK_OFFSET_Y = 65;            // 砖块区域Y偏移
  static const int BORDER_X = 0;                   // 顶部边框X位置
  static const int BORDER_Y = BRICK_OFFSET_Y - 1;  // 顶部边框Y位置
  static const int LEFT_BORDER_X = BORDER_X + 1;   // 左边框高度
  static const int TOP_BORDER_Y = BORDER_Y + 1;    // 顶部边框高度

  static const int INFO_X = 5;                // 信息显示X位置
  static const int INFO_Y = 4;                // 信息显示Y位置
  static const int INFO_V_Y = INFO_Y + 20;    // 信息显示第二行Y位置
  static const int LIVES_X = 120;             // 信息显示X位置
  static const int LIVES_Y = 4;               // 信息显示Y位置
  static const int LIVES_V_Y = LIVES_Y + 20;  // 信息显示第二行Y位置

  // 砖块颜色数组（根据行数不同颜色）
  static const uint16_t BRICK_COLORS[6];

  // 游戏状态
  enum GameState {
    READY,      // 准备状态（球粘在挡板上）
    PLAYING,    // 游戏中
    PAUSED,     // 暂停
    GAME_OVER,  // 游戏结束
    WIN         // 胜利
  };

  // 游戏变量
  GameState state;

  // 挡板
  int paddleX;

  // 球
  float ballX;
  float ballY;
  float ballVX;  // 球的X速度
  float ballVY;  // 球的Y速度

  // 砖块（0=已消除，1-6=不同颜色砖块）
  int bricks[BRICK_ROWS][BRICK_COLS];

  // 游戏数据
  unsigned long score;
  int lives;            // 生命值
  int bricksRemaining;  // 剩余砖块数

  unsigned long lastUpdateTime;

  // 初始化游戏
  void initGame();

  // 绘制函数
  void drawGameArea(Screen &screen);
  void drawPaddle(Screen &screen);
  void drawBall(Screen &screen);
  void drawBricks(Screen &screen);
  void drawInfo(Screen &screen);
  void drawReadyMessage(Screen &screen);
  void drawPausedMessage(Screen &screen);
  void drawGameOver(Screen &screen);
  void drawWin(Screen &screen);

  // 游戏逻辑
  void updateGame();
  void moveBall();
  void movePaddle(int direction);  // -1左，1右，0不动
  void launchBall();               // 发射球
  void checkBallCollision();
  void checkBrickCollision();
  void checkPaddleCollision();
  void resetBall();  // 重置球到挡板上
  bool checkWin();   // 检查是否获胜

  // 输入处理
  void handleInput(Keys &keys);

  // 工具函数
  void clearBall(Screen &screen, int x, int y);
  void clearPaddle(Screen &screen, int x);
};
